package com.mmall.mmall002.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mmall.mmall002.entity.Product;
import com.mmall.mmall002.entity.ProductCategory;
import com.mmall.mmall002.mapper.ProductCategoryMapper;
import com.mmall.mmall002.mapper.ProductMapper;
import com.mmall.mmall002.service.ProductCategoryService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mmall.mmall002.service.ProductService;
import com.mmall.mmall002.vo.ProductCategoryVO;
import com.mmall.mmall002.vo.ProductVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 龙菲
 * @since 2021-03-02
 */
@Service
public class ProductCategoryServiceImpl extends ServiceImpl<ProductCategoryMapper, ProductCategory> implements ProductCategoryService {

    @Autowired
    private ProductCategoryMapper productCategoryMapper;

    @Autowired
    private ProductMapper productMapper;

    @Override
    public List<ProductCategoryVO> getAllProductCategoryVO() {
        /**
         * 一级分类的操作
         */
        //查询所有的一级分类的集合
        QueryWrapper qw = new QueryWrapper();
        qw.eq("type","1");
        List<ProductCategory> levelOne = productCategoryMapper.selectList(qw);
//        //转成VO   第一种方法
//        List<ProductCategoryVO> levelVo = new ArrayList<>();
//        for (ProductCategory productCategory : levelOne) {
//            ProductCategoryVO vo = new ProductCategoryVO();
//            BeanUtils.copyProperties(productCategory,vo);
//            levelVo.add(vo);
//        }
        //转成VO  第二种方法    使用流的方式
        List<ProductCategoryVO> levelOneVo = levelOne.stream()
                .map(e -> new ProductCategoryVO(e.getId(),e.getName())).collect(Collectors.toList());

        //设置图片
        //商品信息赋值
        for (int i = 0; i < levelOneVo.size(); i++) {
            levelOneVo.get(i).setBannerImg("/images/banner"+i+".png");
            levelOneVo.get(i).setTopImg("/images/top"+i+".png");
            qw = new QueryWrapper();
            qw.eq("categorylevelone_id",levelOneVo.get(i).getId());
            List<Product> list =  productMapper.selectList(qw);    //根据一级编号  获得一级编号的商品集合
            //将一级商品集合转为VO集合
            List<ProductVO> listVo =  list.stream()
                    .map(e -> new ProductVO(e.getId(),e.getName(),e.getPrice(),e.getFileName())).collect(Collectors.toList());

            //存储到VO的集合中
            levelOneVo.get(i).setProductVOList(listVo);
        }



        //遍历一级的已经转成VO的集合   查找下一级
        for (ProductCategoryVO levelOneProductCategoryvo : levelOneVo) {
            qw = new QueryWrapper();
            qw.eq("type","2");  //查找二级的商品
            qw.eq("parent_id",levelOneProductCategoryvo.getId());  //对应的父级编号和一级的商品编号相同
            List<ProductCategory>  levelTwo = productCategoryMapper.selectList(qw); //一级商品对应的二级分类
            //将二级分类转成VO
            List<ProductCategoryVO> levelTwoVo = levelTwo.stream()
                    .map(e -> new ProductCategoryVO(e.getId(),e.getName())).collect(Collectors.toList());

            //给一级分类的商品设置子级练习   关联二级分类的商品
            levelOneProductCategoryvo.setChildren(levelTwoVo);

            //遍历二级的VO集合 查找相应的三级
            for (ProductCategoryVO levelTwoProductCategoryvo : levelTwoVo) {
                qw = new QueryWrapper();
                qw.eq("type","3");  //查找三级的商品
                qw.eq("parent_id",levelTwoProductCategoryvo.getId());  //对应的二级商品编号和三级的商品编号相同

                List<ProductCategory>  levelThree = productCategoryMapper.selectList(qw); //二级商品对应的三级分类
                //将三级分类转成VO
                List<ProductCategoryVO> levelThreeVo = levelThree.stream()
                        .map(e -> new ProductCategoryVO(e.getId(),e.getName())).collect(Collectors.toList());

                //给二级分类的商品设置子级练习   关联三级分类的商品
                levelTwoProductCategoryvo.setChildren(levelThreeVo);
            }
        }
        return levelOneVo;
    }
}
